home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Main.c
-
- Description: I'm just a main, yes I'm only a main.
-
- Author: mc, era
-
- Copyright: © Copyright 2000 Apple Computer, Inc. All rights reserved.
-
- Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
- ("Apple") in consideration of your agreement to the following terms, and your
- use, installation, modification or redistribution of this Apple software
- constitutes acceptance of these terms. If you do not agree with these terms,
- please do not use, install, modify or redistribute this Apple software.
-
- In consideration of your agreement to abide by the following terms, and subject
- to these terms, Apple grants you a personal, non-exclusive license, under Apple’s
- copyrights in this original Apple software (the "Apple Software"), to use,
- reproduce, modify and redistribute the Apple Software, with or without
- modifications, in source and/or binary forms; provided that if you redistribute
- the Apple Software in its entirety and without modifications, you must retain
- this notice and the following text and disclaimers in all such redistributions of
- the Apple Software. Neither the name, trademarks, service marks or logos of
- Apple Computer, Inc. may be used to endorse or promote products derived from the
- Apple Software without specific prior written permission from Apple. Except as
- expressly stated in this notice, no other rights or licenses, express or implied,
- are granted by Apple herein, including but not limited to any patent rights that
- may be infringed by your derivative works or by other works in which the Apple
- Software may be incorporated.
-
- The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
- WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
- WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
- COMBINATION WITH YOUR PRODUCTS.
-
- IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
- OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
- (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Change History (most recent first): <2> 7/26/00 carbonized
- <1> 4/01/00 initial release
- */
-
- #include "MP3Player.h"
-
- // globals
- Boolean gDone = false;
- BitMap gScreenbits;
-
- static pascal OSErr HandleOApp(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon);
- static pascal OSErr HandleOApp(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon)
- {
- #pragma unused(theAppleEvent, reply, handlerRefcon)
-
- return noErr; // We're up and running
- }
-
- static pascal OSErr HandlePDoc(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon);
- static pascal OSErr HandlePDoc(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon)
- {
- #pragma unused(theAppleEvent, reply, handlerRefcon)
-
- return noErr;
- }
-
- static pascal OSErr HandleQuit(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon);
- static pascal OSErr HandleQuit(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon)
- {
- #pragma unused(theAppleEvent, reply, handlerRefcon)
-
- gDone = true;
- return noErr;
- }
-
- static pascal OSErr HandleODoc(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon);
- static pascal OSErr HandleODoc(const AppleEvent *theAppleEvent, AppleEvent *reply, unsigned long handlerRefcon)
- {
- #pragma unused(reply, handlerRefcon)
-
- AEDescList docList;
- long index = 1, itemsInList;
- Size actualSize;
- AEKeyword keywd;
- DescType returnedType;
-
- OSErr err;
-
- err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList);
- if (err == noErr) {
- err = AECountItems(&docList, &itemsInList);
- }
-
- if (err == noErr) {
- FSSpecPtr fileSpecPtr;
-
- do {
- fileSpecPtr = (FSSpecPtr)NewPtr(sizeof(FSSpec));
- err = MemError ();
-
- if (err == noErr) {
- err = AEGetNthPtr(&docList, index, typeFSS, &keywd, &returnedType, fileSpecPtr, sizeof(FSSpec), &actualSize);
- }
-
- if (err == noErr) {
- HParamBlockRec pb;
-
- pb.fileParam.ioCompletion = NULL;
- pb.fileParam.ioNamePtr = fileSpecPtr->name;
- pb.fileParam.ioVRefNum = fileSpecPtr->vRefNum;
- pb.fileParam.ioDirID = fileSpecPtr->parID;
- pb.fileParam.ioFDirIndex = 0;
-
- err = PBHGetFInfoSync(&pb);
- if (err == noErr && pb.fileParam.ioFlFndrInfo.fdType != kPreferencesFolderType) {
- err = PlaySound(fileSpecPtr); // get to the meat of the issue, play the damn file already!
- DisposePtr((Ptr)fileSpecPtr);
- }
- }
-
- index++;
- } while (err == noErr);
-
- // The last time through the loop we allocate a pointer we don't need.
- DisposePtr((Ptr)fileSpecPtr);
- }
-
- AEDisposeDesc(&docList);
-
- return err;
- }
-
- static OSErr GetSoundToPlay(FSSpec *fileToPlay);
- static OSErr GetSoundToPlay(FSSpec *fileToPlay)
- {
- OSErr err = noErr;
-
- #ifndef TARGET_API_MAC_CARBON
- if (NavServicesAvailable() == true) {
- #else
- #pragma unused(fileToPlay)
- #endif
- NavReplyRecord navReply;
- NavDialogOptions dialogOptions;
-
- err = NavGetDefaultDialogOptions(&dialogOptions);
- if (err == noErr) {
- dialogOptions.dialogOptionFlags = kNavAllFilesInPopup;
- }
-
- if (err == noErr) {
- err = NavGetFile(NULL, &navReply, &dialogOptions, NULL, NULL, NULL, NULL, NULL);
- }
-
- if (navReply.validRecord && err == noErr) {
- ProcessSerialNumber processSN = {0, kCurrentProcess};
- AEAddressDesc targetAddress = {typeNull, NULL};
- AppleEvent theODOC = {typeNull, NULL},
- theReply = {typeNull, NULL};
-
- // Create an Apple Event to ourselves.
- err = AECreateDesc(typeProcessSerialNumber, &processSN, sizeof(ProcessSerialNumber), &targetAddress);
-
- if (err == noErr) {
- // Create the open document event.
- err = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, &targetAddress, kAutoGenerateReturnID, kAnyTransactionID, &theODOC);
- AEDisposeDesc(&targetAddress);
- }
-
- if (err == noErr) {
- // Put the list of files into the open document event Apple Event.
- err = AEPutParamDesc (&theODOC, keyDirectObject, &(navReply.selection));
- }
-
- if (err == noErr) {
- // Send the open document event to ourselves.
- err = AESend(&theODOC, &theReply, kAENoReply, kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
- AEDisposeDesc(&theODOC);
- AEDisposeDesc(&theReply);
- }
-
- }
-
- NavDisposeReply (&navReply);
-
- #ifndef TARGET_API_MAC_CARBON
- } else {
- SFTypeList typeList = {'AIFF', 'AIFC', 0, 0};
- StandardFileReply sfReply;
-
- StandardGetFile(nil, 2, typeList, &sfReply);
-
- if (sfReply.sfGood == true) {
- *fileToPlay = sfReply.sfFile;
- err = PlaySound(fileToPlay);
- } else {
- err = userCanceledErr;
- }
- }
- #endif
-
- return err;
- }
-
- static OSErr DispatchMenuChoice(long menuChoice);
- static OSErr DispatchMenuChoice(long menuChoice)
- {
- short menu;
- short item;
- FSSpec fileToPlay;
-
- OSErr err = noErr;
-
- if (menuChoice != 0) {
- menu = HiWord(menuChoice);
- item = LoWord(menuChoice);
- switch (menu) {
- case kFileMenu:
- switch (item) {
- case kOpenItem:
- err = GetSoundToPlay(&fileToPlay);
- break;
- case kQuitItem:
- gDone = true;
- break;
- }
- }
- }
-
- HiliteMenu (0);
-
- return err;
- }
-
- static OSErr InstallRequiredAppleEvents(void);
- static OSErr InstallRequiredAppleEvents(void)
- {
- OSErr err;
-
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, NewAEEventHandlerUPP(HandleOApp), 0, false);
-
- if (err == noErr)
- err = AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, NewAEEventHandlerUPP(HandleODoc), 0, false);
-
- if (err == noErr)
- err = AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, NewAEEventHandlerUPP(HandlePDoc), 0, false);
-
- if (err == noErr)
- err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(HandleQuit), 0, false);
-
- return err;
- }
-
- static OSErr MenuBarInit (void);
- static OSErr MenuBarInit (void)
- {
- Handle menuBar;
- MenuHandle menu;
-
- OSErr err = noErr;
-
- menuBar = GetNewMBar(128);
- if (menuBar != nil) {
- SetMenuBar (menuBar);
- menu = GetMenuHandle(128);
- if (menu != nil) {
- DrawMenuBar ();
- } else {
- err = memFullErr;
- }
- } else {
- err = memFullErr;
- }
-
- return err;
- }
-
- // --------------------
- // Initialize for Carbon & QuickTime
- //
- static OSErr Initialize(void);
- static OSErr Initialize(void)
- {
- OSErr err = noErr;
-
- InitCursor();
- EnterMovies();
-
- GetQDGlobalsScreenBits(&gScreenbits);
-
- err = InstallRequiredAppleEvents();
- err = MenuBarInit();
-
- return err;
- }
-
- void main(void) {
- Boolean gotEvent;
- EventRecord theEvent;
- WindowRef theWindow;
- short thePart;
-
- OSErr err = noErr;
-
- err = Initialize();
-
- while (!gDone) {
- gotEvent = WaitNextEvent(everyEvent, &theEvent, 10, NULL);
-
- if (gotEvent) {
- switch (theEvent.what) {
- case kHighLevelEvent:
- err = AEProcessAppleEvent(&theEvent);
- break;
-
- case mouseDown:
- thePart = FindWindow (theEvent.where, &theWindow);
- switch (thePart) {
- case inMenuBar:
- DispatchMenuChoice(MenuSelect(theEvent.where));
- break;
- }
- break;
-
- case keyDown:
- if (theEvent.modifiers & cmdKey) {
- err = DispatchMenuChoice(MenuKey(theEvent.message & charCodeMask));
- }
- break;
-
- default:
- break;
-
- } // switch
- }
- }
- }